外键也是主键的一部分
问题描述:
在纯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();
}}
的问题是在课堂上 “二”:
如果我设置 “插入=假,可更新=假” 在现场 “一”,它抛出异常:
“参数索引超出范围4不是与1有效值3之间”
而我f在@manyToOne的关系中设置“insertable = false,updatable = false”,它运行但在表“Second”的“a”中设置为0
目标:将First.a的生成值设置为Second 。一个。
/////////////////////////////
的SQL创建DB:
创建表第一个( 一个int, 主键(a) );
创建表第二( 一个INT, b INT, 主键(A,B) );
create table third( a varchar(20), b int );
请...帮助
Thanx提前
答
首先,你确定你需要? ...
无论如何。我可能会在这里表现出我的无知,但我认为你可能非常接近,但事情的顺序却不是。
读取生成的密钥可以这样做:
...
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但如果你是幸运的休眠可以支持同时具有@Id和@ManyToOne标签设置在同一领域。你尝试过吗?这将是不错的:-) ...
@Id // may not work
@ManyToOne // may not work
@JoinColumn(name = "a")
First a;
哦,什么是“a”前缀所有关于?论据?含糊不清?矛盾的?安Enterprisy - 事物?
Thanx给你,我试了@id @manytoone,但它似乎不工作。 – Moro 2009-04-28 19:07:02