我在使用JPA/Hibernate(3.5.3)设置时遇到问题,我有一个实体,一个"帐户"类,它有一个子实体列表,"联系"实例.我正在尝试将Account的实例添加/删除到Account的List <Contact>属性中.
将新实例添加到集合中并调用saveOrUpdate(account)可以保持一切可爱.如果我然后选择从列表中删除联系人并再次调用saveOrUpdate,则SQL Hibernate似乎会产生涉及将account_id列设置为null,这违反了数据库约束.
我究竟做错了什么?
下面的代码显然是一个简化的摘要,但我认为它涵盖了问题,因为我在不同的代码中看到相同的结果,这真的是这个简单.
SQL:
CREATE TABLE account ( INT account_id );
CREATE TABLE contact ( INT contact_id, INT account_id REFERENCES account (account_id) );
Run Code Online (Sandbox Code Playgroud)
Java的:
@Entity
class Account {
@Id
@Column
public Long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "account_id")
public List<Contact> contacts;
}
@Entity
class Contact {
@Id
@Column
public Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "account_id", nullable = false)
public Account account;
}
Account account = new Account();
Contact contact = new …Run Code Online (Sandbox Code Playgroud) C#是我最熟悉的语言,但在工作时使用Java.我想你可以说我对使用Visual Studio IDE很满意.我喜欢它的调试器之一是我可以为任何表达式放置监视变量(Eclipse中的"表达式").因此,我可以在调试时查看公共或非公共特定字段的值,调用方法等,没有问题.
我似乎不能在Eclipse中做同样的事情.我不得不求助于为字段调用相关的getter方法(假设它有一个).如果它没有,我要么暂时添加一个,所以我可以查看它,记得在我完成时删除它或者我只是SOL.
如何在一个私有字段上为对象设置监视表达式?或者我只是做错了,我必须制作特殊的表达方式来查看它们?
(或者,有没有更好的方法来获取我想要的信息?)
例如,
我有一个HttpServletRequest想要留意的requestURI.如果我只是观察请求变量,它会列出很多字段,而且信息太多了.我只对对象中的一件事感兴趣,所以为了最小化这个,我想为这一件事添加一个表达式.
字段名称显然是requestURI这样我添加了表达式:request.requestURI.Eclipse抛出一个错误,说它不是一个字段(它是,它只是不公开).我不得不直接去场地,而是去吸气器:request.getRequestURI()这很好.但我不能总是指望吸气剂可用.

变量视图

表达式视图
我试图替换ProgramItem上的TimeBlock对象,然后删除旧的TimeBlock对象.删除部分给我带来了问题.我有一些'相对'简单的nHibernate问题删除旧的TimeBlock对象.
例外:
已删除的对象将通过级联重新保存(从关联中删除已删除的对象)[*.Mode.TimeBlock#15]
15是oldTimeBlock的Id
我在解决这类问题时没有遇到任何问题我只是尝试了以下任何用法:
oldTimeBlock.ProgramItems = new List<ProgramItem>();
programItem.TimeBlock = null;
Run Code Online (Sandbox Code Playgroud)
以任何顺序保存和删除块,并使用Inverse()更改映射.
我需要一些新鲜的眼睛 - 我怎么能让这个工作?
码:
public class TimeBlock
{
public virtual int Id { get; set; }
public virtual IList<ProgramItem> ProgramItems { get; set; }
...
}
public class TimeBlockMap : ClassMap<TimeBlock>
{
public TimeBlockMap()
{
Id(x => x.Id);
HasMany(x => x.ProgramItems).Cascade.SaveUpdate(); // Have tested with Inverse() but seemed to make no difference
}
}
public class ProgramItem : ImageModel, IIdentifiable
{
public virtual int Id { get; …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我无法删除属于多对多关系的对象.我收到以下错误:
Exception in thread "main" org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [edu.cs157b.hibernate.AppointmentRequest#11]
at org.hibernate.internal.SessionImpl.forceFlush(SessionImpl.java:1232)
Run Code Online (Sandbox Code Playgroud)
这是我的三个类,它们映射了多对多的关系.从本质上讲,Doctor有很多Patients通过AppointmentRequest,反之亦然.这是课程
医生
package edu.cs157b.hibernate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
@Entity
@Table(name="DOCTOR_INFO")
@NamedQueries (
{
@NamedQuery(name = "Doctor.getAll", query = "from Doctor"),
@NamedQuery(name = "Doctor.findByName", query = "from Doctor where name = :name")
}
)
public class Doctor implements Person {
private int id;
private String name;
private Specialty specialty;
private List<AppointmentRequest> appointmentRequests …Run Code Online (Sandbox Code Playgroud)