映射到仅具有 getter 的 Hibernate/JPA 列(没有实际的 class 属性)

Map to Hibernate/JPA column with getter only (no actual class attribute)

我有一个模型,我想使用 JPA 2 保留它,这个模型包含一个字符串列表。在 db 上,我想要一个带分隔符的连接字符串,而不是字符串列表。我是否必须使用包含连接字符串的属性,或者用@Column 修饰的方法 "getJoindString" 是否足够?

这是一个例子:

@Entity
@Table(name = "times")
public class TimesList {

    private transient List<String> times;

    @Transient
    public List<String> getTimes() {
        if (times == null) {
            times = new ArrayList<String>();
        }
        return times;
    }

    @Column(name = "joinedTimes")
    public String getJoinedTimes() {
        return String.join("|", getTimes());
    }

    public void setJoinedTimes(String joinedTimes) {
        times = Arrays.asList(joinedTimes.split("|"));
    }

}

即使 joinedTimes 实际上不是 class 属性而只是一个方法返回的值,这对于 JPA 2 来说是否是一个有效的 POJO?

那行不通...使用这种方法:

  1. 将您的方法 getTime 保留为瞬态,但创建一个用 @Column 注释的字段...此字段将映射到将时间存储为连接字符串的列...

  2. 创建一个包方法并用@PrePersist注释...让我们称之为joinTime...这个方法将在将实体保存到数据库之前被JPA调用并将设置时间列的值作为连接字符串...

  3. 创建另一个包方法并用@PostLoad注释...我们称它为parseJoinTime...当实体加载到entityManager中时JPA将调用此方法.. . 在这里你将把你的列值(连接的字符串)转换成你的时间列表...

就这些了...

如果您想了解有关此方法的更多信息,请查找 JPA 实体侦听器