hibernate通过annotation自动生成数据库表

来源:互联网 发布:js获取form表单的值 编辑:程序博客网 时间:2024/05/16 07:32

在生成数据库表的过程中,

报 javax.persistence.OneToMany.orphanRemoval()Z异常的解决方法:去掉myeclipse中的j2ee包居然就可以了!!

 

 

@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();
 }
}

 经过这些配置就可以生成数据库表了!!