在这段代码中,如何为复合键生成Java类(如何在hibernate中复合键):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud) 我继承了一个使用Hibernate 3.0连接到SQL Server数据库的Websphere Portal项目.
这个项目中大约有130个Hibernate表类.它们都实现了Serializable.它们都没有声明serialVersionUID字段,因此Eclipse IDE会显示所有这些类的警告.
这些类是否真的需要实现Serializable?
如果是这样,是否有任何工具可以同时将生成的serialVersionUID字段添加到大量类中(只是为了使警告消失)?
是否有必要将composite-id映射到类?
可以这样吗?
<composite-id>
<key-property=..../>
<key-property=..../>
</composite-id>
Run Code Online (Sandbox Code Playgroud)
或应该是
<composite-id class=....>
<key-property=..../>
<key-property=..../>
</composite-id>
Run Code Online (Sandbox Code Playgroud)
如果有必要,如果我们有复合键那么该类应该实现equals()和override()方法?
所以我有以下情况:
@Entity
class Image {
@Id
@GeneratedValue
private Long id;
....
}
@Entity
class ImageData implements Serializable {
@Id
@OneToOne
private Image image;
....
}
Run Code Online (Sandbox Code Playgroud)
这一切都工作正常,但为什么 ImageData 需要可序列化?如果不是,我会收到异常,它需要可序列化:
org.hibernate.MappingException: composite-id class must implement Serializable:...
Run Code Online (Sandbox Code Playgroud)
我知道标识符需要可序列化,但为什么现在却相反了?
在教程中提供的示例代码的非常精简版本中,嵌入式复合主键:主键«JPA«Java教程,我得到:
javax.persistence.PersistenceException: [PersistenceUnit: unit] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at [my code that calls e.persist on a Student]
Run Code Online (Sandbox Code Playgroud)
异常是相当通用的,但Hibernate提供了一些很好的日志调试信息(我用<package>替换了实际的包名):
[DEBUG] org.hibernate.boot.internal.ClassLoaderAccessImpl: Not known whether passed class name [<package>.Student] is safe
[DEBUG] org.hibernate.boot.internal.ClassLoaderAccessImpl: No temp ClassLoader provided; using live ClassLoader for loading potentially unsafe class : <package>.Student
Run Code Online (Sandbox Code Playgroud)
这是蒸馏代码.(背景故事是我一直试图创建一个具有嵌入式id的实体无效.经过一段时间尝试调试之后,我重新开始使用这个教程代码,删除内容直到我得到相同的错误.)
@Embeddable
class StudentId {
private int id;
public StudentId() {}
public StudentId(int id) { this.id = id; }
@Override
public boolean …Run Code Online (Sandbox Code Playgroud) 鉴于以下表格:
Car
int id PK
int modelId FK
CarDetails
int carId PK, FK to Car.id
varchar(50) description
Run Code Online (Sandbox Code Playgroud)
我如何表明@IdofCarDetails也是 的外键Car?
我试过了:
@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne
@JoinColumn(name = "modelId", nullable = false)
private Model model;
//setters & getters
}
@Entity
public class CarDetails {
@Id
@OneToOne
@JoinColumn(name = "carId", nullable = false)
private Car car;
private String description;
//setters & getters
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误
org.hibernate.MappingException: Composite-id class must …