我正在使用现有的数据库架构处理遗留代码库.现有代码使用SQL和PL/SQL在DB上执行查询.我们的任务是使项目数据库引擎不可知的一小部分(最初,最终改变一切).我们选择使用Hibernate 3.3.2.GA和"*.hbm.xml"映射文件(而不是注释).遗憾的是,更改现有架构是不可行的,因为我们无法回退任何遗留功能.
我遇到的问题是当我试图映射单向,一对多的关系时,FK 也是复合PK的一部分.这是类和映射文件......
CompanyEntity.java
public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.java
public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用JPA 2.0和Hibernate作为持久性提供程序.我在两个实体之间有一对多的关系(使用@JoinColumn和不使用@JoinTable).我想知道如何在JPA注释中指定inverse=true(如指定hbm.xml)来反转关系所有者.
谢谢.
我遇到了一些问题的可能答案,但这是关于从Hibernate 3.4.0GA升级到Hibernate 4.1.8的问题.所以这曾经在以前的版本下工作,我已经搜索了为什么它在这个新版本中突破的原因.
我得到了
org.hibernate.TransientObjectException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.test.server.domain.model.NoteItem.note - > com.test.server.domain.model.Note
任何帮助都会很棒.
这是我的课程.
@MappedSuperclass
public abstract class EntityBase implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
@Version
@Column(name = "VERSION")
protected Long version;
public Long getId() {
return id;
}
public Long getVersion() {
return version;
}
protected static final EntityManager entityManager() {
return EntityManagerUtil.getEntityManager();
}
}
@Entity
@Table(name = "WORK_BOOK")
public class WorkBook extends EntityBase {
private static …Run Code Online (Sandbox Code Playgroud) 我有两个实体,一个实体"电影"和一个实体"剪辑"每个剪辑属于一个电影,一个电影可以有多个剪辑.
我的代码看起来像:
Movie.java
@OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Clip> clips = new HashSet<Clip>();
Clip.java
@ManyToOne
@JoinColumn(name="movie_id")
private Movie movie;
Run Code Online (Sandbox Code Playgroud)
正在生成表,每个Clip都有一个列"movie_id"但这会导致我的应用程序在我请求数据时最终处于无限循环中
@Path("/{id:[0-9][0-9]*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Movie lookupMovieById(@PathParam("id") long id) {
return em.find(Movie.class, id);
}
result:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M...
Run Code Online (Sandbox Code Playgroud)
当我请求剪辑时,结果相同.
当我将它改为@ManyToMany关系时,不会有任何类似的问题,但这不是我在这里需要的.你能帮助我吗?将fetchType设置为Lazy不起作用.
编辑:我正在使用当前的JBoss开发工作室
编辑:
通过阅读本文,我"解决了"这个问题:
http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-list.html
"要将双向一个映射到多个,一对多一侧作为拥有方,您必须删除mappedBy元素并将多个@JoinColumn设置为可插入且可更新为false.此解决方案显然未进行优化并会产生一些额外的UPDATE语句."
当我要求电影时,我得到以下答案:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1, "名称":"演练"}],"剪辑":[],"说明":"预告片zu mgs4"}
条目"剪辑"仍然出现.这仍然是错误的解决方案还是我必须忍受这个?
为什么hibernate为这些类使用连接表?
@Entity
public class CompanyImpl {
@OneToMany
private Set<Flight> flights;
@Entity
public class Flight {
Run Code Online (Sandbox Code Playgroud)
我既不想要连接表也不想要双向关联:(
我正在研究遗留系统,需要从数据库中读取一些信息.以下是表格关系
供应商(vendorId - pk,vendorEid,name)
VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
联系人(contactId -pk,contactEid,phone)
vendorEid和contactEid不是表的主键,而是用作Join表VendorContactBridge中的连接列.
供应商实体 -
@Entity
@Table(name="Vendor")
public class Vendor implements Serializable{
@Id
@Column(name="VENDORID")
private BigDecimal vendorId;
@Column(name="VENDOREID")
private BigDecimal vendorEid;
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name="VENDORCONTACTBRIDGE",
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")},
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")})
private Set<Contact> vendorContact;
}
Run Code Online (Sandbox Code Playgroud)
联系实体 -
@Entity
@Table(name="CONTACT")
public class Contact implements Serializable{
@Id
@Column(name="CONTACTID")
private BigDecimal contactId;
@Column(name="CONTATEID")
private BigDecimal contactEId;
@ManyToOne
@JoinTable(name="VENDORCONTACTBRIDGE",
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")},
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")})
private Vendor vendor;
}
Run Code Online (Sandbox Code Playgroud)
在运行查询时,获得以下异常
SecondaryTable JoinColumn无法引用非主键.
我删除了我在供应商实体中提供的Eager fetch,我没有得到任何异常,但它没有加载集合.关联有什么问题?
我收到一个错误:
不要使用cascade ="all-delete-orphan"更改对集合的引用
在尝试以下操作时:
beginTx();
Parent parent = new Parent();
Child child = new Child();
parent.addChild(child);
getSession().save(parent);
commitTx();
closeSession();
beginTx();
//id is the primary key
child.setID(null);
getSession().update(child);
commitTx();
closeSession();
Run Code Online (Sandbox Code Playgroud)
父母和孩子通过one-to-manycascade =' all-delete-orphan'相关联.
class Parent {
Set child;
}
<set name="child" table="Child" cascade="all-delete-orphan" inverse="true">
<key column="FK"></key>
<one-to-many class="Child"/>
</set>
Run Code Online (Sandbox Code Playgroud)
知道为什么会抛出这个异常吗?为什么即使实体处于分离状态,在主键上设置null也会导致此异常?
我和Many-to-Many班级之间有关系.因为我想获得有关辅助表的其他信息,所以我必须创建一个帮助类,如下所述:使用JPA和Hibernate时,使用额外列映射多对多关联的最佳方法FooBarFooBar
我创建了一个Foo,并创建了一些条形图(保存到DB).当我然后使用其中一个条添加到foo
foo.addBar(bar); // adds it bidirectionally
barRepository.save(bar); // JpaRepository
Run Code Online (Sandbox Code Playgroud)
然后创建FooBar的DB条目 - 正如预期的那样.
但是,当我想再次从foo中删除相同的栏时,使用
foo.removeBar(bar); // removes it bidirectionally
barRepository.save(bar); // JpaRepository
Run Code Online (Sandbox Code Playgroud)
然后,不会从数据库中删除先前创建的FooBar条目.通过调试,我看到foo.removeBar(bar);确实删除了双向.没有异常被抛出.
难道我做错了什么?我很确定它与Cascading选项有关,因为我只保存吧.
我尝试过的:
添加orphanRemoval = true@OneToMany - 注释,但没有用.我认为这是正确的,因为我不删除 Foo和Bar,只删除他们的关系.
从@OneToMany注释中排除CascadeType.REMOVE,但与orphanRemoval相同我认为这不适用于这种情况.
编辑: 我怀疑在我的代码或模型中必须有一些东西与我的orphanRemoval混淆,因为现在已有2个答案说它有效(带orphanRemoval=true).
最初的问题已得到解答,但如果有人知道什么可能导致我的孤儿无法工作,我会非常感谢您的意见.谢谢
代码:Foo,Bar,FooBar
public class Foo {
private Collection<FooBar> fooBars = new HashSet<>();
// constructor omitted for brevity
@OneToMany(cascade = CascadeType.ALL, mappedBy = "foo", fetch = FetchType.EAGER)
public Collection<FooBar> getFooBars() …Run Code Online (Sandbox Code Playgroud) 如何在Hibernate中映射一对多关系,其中多方需要进行分页?(即你有数百个或更多的相关对象)
使用OneToMany批注(或其xml等价物)是没用的,因为加载单方对象会检索所有相关对象导致内存灾难(即使你使用延迟加载) .
一种可能的方法(我已经在使用)是在DAO实现中添加一个getter方法,您可以在其中引入分页参数.但是,我可以看到这并不理想,因为你失去了一些功能,比如级联(例如,我必须在DAO类中包含setter方法来关联对象).此外,您失去了一些OOP意识,因为单侧对象没有检索其相关多方对象的方法.什么是最好的解决方案?
为了进一步说明我的观点,假设我有两个类,它们之间有以下关系:A有很多B.
我不能使用OneToMany注释编写A.getAllB()方法,因为有数百个B与之相关因此,为了对结果进行分页,我使用getAllB()方法创建了一个单独的ADaoImpl类,其中我可以包含分页参数,一次只返回一页数据.它是否正确?任何帮助将不胜感激.
班级 Student
public class Student {
private Long id;
private String name;
private String className;
private List<Phone> phones;
// getter setter
}
Run Code Online (Sandbox Code Playgroud)
班级 Phone
public class Phone {
private Long id;
private String number;
//getter setter
}
Run Code Online (Sandbox Code Playgroud)
-> 映射文件 Student.hbm.xml
<id name="id" type="long" column="id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<property name="className" column="class_name" type="string" />
<list name="phones" cascade="all-delete-orphan">
<key column="student_id"/>
<list-index column="idx" />
<one-to-many class="Phone" />
</list>
Run Code Online (Sandbox Code Playgroud)
-> 映射文件 Phone.hbm.xml
<id name="id" type="long" column="id">
<generator class="native" /> …Run Code Online (Sandbox Code Playgroud)