外键也是主键的一部分

时间:2009-04-28 13:58:52

标签: java database jpa

普通的JPA或JPA + Hibernate扩展是否可以使用也是复合主键一部分的外键?

@TableGenerator(name = "trial", table = "third",
        pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first")    
@Entity    
public class First{    
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "trial")
protected int a;

@OneToMany(mappedBy ="first", cascade = CascadeType.PERSIST)
@JoinColumn(name = "a")
protected List<Second> seconds;
}

class IDC implements Serializable{
 //@Column(name = "a", insertable = false, updatable = false)
    protected int a;
protected int b;
}

@Entity    
@IdClass(IDC.class)
public class Second{    
    @Id
  //@Column(name = "a", insertable = false, updatable = false)
protected int a;
@Id
protected int b;

    @ManyToOne
@JoinColumn(name = "a"/*, insertable = false, updatable = false*/)
First first;
}

主:

public class Persister {
public static void main(String[] args) {

First aFirst = new First();

Second aSecond = new Second();
aSecond.b = 300;    
List<Second> scnds = new ArrayList<Second>();
scnds.add(aSecond);

aFirst.seconds = scnds;
aSecond.first = aFirst;


aEntityManager.getTransaction().begin();
aEntityManager.persist(aFirst);
aEntityManager.getTransaction().commit();
}}

问题出在“第二”课:

如果我在字段“a”处设置“insertable = false,updatable = false”,则抛出异常:

“参数索引超出范围.4不在有效值1和3”之间

如果我在@manyToOne的关系中设置“insertable = false,updatable = false”,它会运行,但在表“Second”的“a”中设置0

目标:在Second.a中设置First.a的生成值。

/////////////////////////////

用于创建数据库的SQL:

首先创建表格( 一个int, 主键(一) );

创建第二个表( 一个int, b int, 主键(a,b) );

创建表格第三( 一个varchar(20), b int );

请...帮助

提前完成

1 个答案:

答案 0 :(得分:2)

首先,你确定需要吗? ...

反正。我可能会在这里表现出我的无知,但我认为你可能会非常接近,但事情的顺序却不是。

读取生成的密钥可以这样做:

...
First first = new First();
entityManager.save(first);  //<- the id is updated

Second second = new Second();
second.setB(300);     
second.setA(first.getA()); 

first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);

entityManager.getTransaction().commit();

你读过这个吗?

Java Persistence : Mapping A Joing Table With Additional Columns

它不是JPA,但如果你的幸运,hibernate可能支持在同一个字段设置@Id和@ManyToOne标记。你试过吗?那不是很好:-) ......

 @Id  // may not work
 @ManyToOne // may not work
 @JoinColumn(name = "a")
 First a;

哦,什么是“一个”前缀呢?参数?暧昧?矛盾的?安Enterprisy - 事物?