使用hibernate动态创建表

时间:2012-08-09 12:18:41

标签: java hibernate entity creation

我现在正在学习Hibernate ORM(第3节),我有一个问题。 我有一个名为USERS的表,使用注释创建:

package com.hibernatedb.entities;

import javax.persistence.*;

@Entity
@Table(name = "USERS",uniqueConstraints = {@UniqueConstraint(columnNames={"USER_LOGIN", "USER_EMAIL"})})
public class User {

@Column(name = "USER_LOGIN", length=80, nullable=false)
private String login;

@Column(name = "USER_PASS", length=80, nullable=false)
private String password;
    @Column(name = "USER_EMAIL", length=80, nullable=false)
private String email;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "USER_ID", nullable=false)
private Long id;

...
// some getters and setters, toString() and other stuff
... 
}

产品实体:

@Entity
@Table(name = "PRODUCTS",uniqueConstraints = {@UniqueConstraint(columnNames={"PRODUCT_ID", "PRODUCT_NAME"})})
public class Product {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="PRODUCT_ID")
private long id;

@Column(name="PRODUCT_NAME", length=85, nullable=false)
private String name;

@Column(name="PRODUCT_DESCRIPTION", columnDefinition="mediumtext", length=1000)
private String description;

@Column(name="PRODUCT_COST", nullable=false)
private double cost;

所以我的问题是:如何创建一个名为“USER +

”的表
  

User.getId()

BUYS“,其中包含2个外键(USER_ID和PRODUCT_ID),用于实体中的用户(表记录)”用户“ 没有原始SQL表创建,但使用Hibernate注释或XML映射。所以我想要像

这样的东西
public class TransactionEntityBulider() {
public TransactionEntityBulder(User user)    
     // something that build me "USER + User.getId() BUYS" table and
}
public TransactionEntity getEntity() {
     // something that return a "USER + User.getId() BUYS" table entity
}

此外,我想看到另一种方法来解决我的问题。

1 个答案:

答案 0 :(得分:0)

我认为hibernate不是为了这种用法而做的,因为你必须使用动态映射。 Hibernate提供了静态指定映射的方法(xml和注释)。

我建议你修改你的方法。将所有“USER_BUY”放在同一个表中通常不应该是有害的。示例:

@Entity
public class User { 
...
    @OneToMany(cascade=CascadeType.ALL, mappedBy="user")
    List<UserBuys> buys = new ArrayList<UserBuys>(); 
...
}

@Entity
public class Product { ... }

@Entity
public class UserBuys {
  ...

  @ManyToOne
  Product product;

  @ManyToOne
  User user;
}