Hibernate自定义复合类型列表

时间:2011-03-15 19:40:35

标签: hibernate

Joda Time没有LocalTimes之间的间隔概念,所以我做了一个:

public final class LocalInterval
{
  private LocalTime start;
  private LocalTime end;
  ..

当然我也支持Hibernate,将本地时间存储为两个属性,“start”和“end”:

public class PersistentLocalIntervalAsTime implements CompositeUserType, Serializable
{
  public String[] getPropertyNames() {return new String[]{"start", "end"};}
  ...

在我的package-info.java类中,我映射了“LocalInterval”:

@TypeDef(
  name = "LocalInterval",
  typeClass = PersistentLocalIntervalAsTime.class
),

所以现在我只想在MyClass中有一个LocalInterval列表:

@CollectionOfElements(targetElement=LocalInterval.class)
List<LocalInterval> intervals;

Hibernate不喜欢这样,并说它无法弄清楚这种类型。所以我试过了:

@CollectionOfElements(targetElement=LocalInterval.class)
@Type(type="LocalInterval")
List<LocalInterval> intervals;

至少生成了一个模式,但架构有:

create table myclass_intervals (
  element time,
  myclass varchar(40) not null
) ENGINE=InnoDb;

看起来不对 - 我不应该有两个TIME列,“start”和“end”,而不是一个TIME列“element”?

1 个答案:

答案 0 :(得分:0)

显然你必须向Hibernate明确指出应该使用多个列:

@CollectionOfElements(targetElement=LocalInterval.class)
@Type(type="LocalInterval")
@Columns(columns={@Column(name="start"), @Column(name="end")})
List<LocalInterval> intervals;

我不知道为什么Hibernate不会通过查询PersistentLocalIntervalAsTime来自动解决这个问题---或者至少抛出错误而不是创建默认的单列。