• ejb 注解


    1   mappedBy:出现于关系被维护端中,相当于inverse=true,表示对方维护关系。用于定义双向关系,在单向关系中不使用。在关系被维护端建立外键列指向关系维护端的主键列。

    2   optional:中文意思是可选的,如果为true表示可选的,反应到数据库表示另一方为null,如果为false表示不可选,反应到数据库表示另一方必须要有值,不可以为null。

    3   cascade:级联操作,值为refresh表示刷新,可能被其它操作修改原来的记录,这样就获取不到最新的记录,因此使用refresh;值为persist表示级联保存,值为merge表示级联更新,值为remove表示级联删除。它们都对应到方法上,如果采用delete语句来执行,是不会有级联删除的效果的,必须用remove方法。

    4    fetch:抓取策略,一种是懒加载一种是立即加载。在Many的一方一般默认为懒加载。

    5   JoinColumn:用于指定外键的,里面的name属性表示外键名称。 订单和订单项,它们是一对多的关系。

    Order类:

    /**
      * 在关系维护中,多的一方为关系维护端,关系维护端负责外键记录的更新。关系被维护端则没有权利更新外键 的记录。
      */
     //当注解以Many结尾时且需要关系维护,那么fetch的默认值为延迟加载;为One时,默认为立即加载。
     //mappedBy出现在关系被维护端中,表示关系被维护端在关系维护端中的属性。
     @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY,mappedBy="order")
     public Set<OrderItem> getOrderitem() {
      return orderitem;
     }

    /**
      * 添加订单项  由于Order是关系被维护端,因此不能更新外键的,外键维护必须是OrderItem
      * @param orderItem
      */
     public void addOrderItem(OrderItem orderItem){
      orderItem.setOrder(this); //一定要有这条语句,它是维护外键。
      orderitem.add(orderItem);
     }

    OrderItem类:

    /**
      * optional表示是否可选,如果为true,则为可选就是可以为null。如果为false,则为不可选就是不能为空
      * @JoinColumn(name="order_id"):表示外键的注解,name属性表示外键的名称
      */
     @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
     @JoinColumn(name="order_id")
     public Order getOrder() {
      return order;
     }

    @oneToMany(mappedBy="另一方类中对应的属性名(外键)",cascade=CascadeType.ALL,fetch=FetchType.EAGER)就相当于xml配置中的inverse=true

    在单向关系中没有mappedBy。

     mappedBy一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方);

    主控方相当于拥有指向另一方的外键的一方。

    mappedBy指定的是不需要维护关系的一端

     

    @ManyToOne

    @JoinColumn(name="外键的字段名")

    1.一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。

    2.一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。

    3.多对多中,joinColumns写的都是本表在中间表的外键名称,

      inverseJoinColumns写的是另一个表在中间表的外键名称。

     mappedBy跟JoinColumn/JoinTable总是处于互斥的一方

     

    如产品类型和产品的关系:

    @Entity
    @Table(name="tb_productType")//经常给漏掉这东西

    public class ProductType extends BaseBean 
    {
     private static final long serialVersionUID = 3466104768256418884L;
     @Column(nullable=false,unique=true)
     private String name;
     @OneToMany(mappedBy="type",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
     private List<Product> products;

    ...

    和:

    @Entity
    @Table(name="tb_product")

    public class Product extends BaseBean 
    {
     private static final long serialVersionUID = 4109238647414563541L;
     @Column(nullable=false)
     private String name;
     @Column(precision=2)
     private double price;
     @Basic(fetch = FetchType.LAZY)
     @Column(columnDefinition = "longtext")
     private String intro;
     private String masterDrowing;
     @ManyToOne
     @JoinColumn(name="productType_id")
     private ProductType type;
     private String comment;
     private int hit;
     private boolean finalRealse;
     private int count;
     @ManyToOne
     @JoinColumn(name="person_id")
     private Person contacter;
     @Temporal(value = TemporalType.DATE)
     private Date realseDate;

    ...

    hibernate的配置文件:

    <hibernate-configuration>

     <session-factory>

      <property name="connection.driver_class">
       com.mysql.jdbc.Driver
      </property>
      <property name="connection.url">
       jdbc:mysql://localhost:3306/site?characterEncoding=UTF-8
      </property>
      <property name="connection.username">root</property>
      <property name="connection.password">root</property>

      <property name="dialect">
       org.hibernate.dialect.MySQLDialect
      </property>

      <property name="show_sql">true</property>
      <property name="hbm2ddl.auto">create</property>

      <!-- 要加这一句  否则可能会遇到异常 -->
      <property name="current_session_context_class">thread</property>

       <mapping class="com.fdauto.bean.Product" />
      <mapping class="com.fdauto.bean.ProductType" />
      </session-factory>

    </hibernate-configuration>

    产生数据库表的类:

    createTable类

    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;

    public class CreateTable {
     static void create(){
      SchemaExport export = new SchemaExport(new AnnotationConfiguration().configure());
         export.create(true, true);
     }
     public static void main(String[] args){
      create();
     }
    }

  • 相关阅读:
    HTML标签
    Web标准
    Web服务器 (获取域名)
    网站favicon.ico 图标
    模块化
    外边距
    h5css产品模块设计
    用策略模式(自定义注解+包扫描)解决if else 太多的问题
    方法区 永久代 元空间 常量池
    javac jar java
  • 原文地址:https://www.cnblogs.com/lbangel/p/2998047.html
Copyright © 2020-2023  润新知