Пожалуйста, ради старых и новых богов этого не делайте сильный>
Выполнение чего-то подобного полностью испортит вашу базу данных. Вы рано или поздно столкнетесь с проблемами. Просматривая свой профиль, вы получили степень CS, так что вы определенно прошли курс по базам данных. Помните вторую нормальную форму и Третья нормальная форма и как вы ее нарушите, если у вас есть атрибуты, которые зависят от других атрибутов.
Что вам нужно сделать, так это иметь либо временное поле (отмеченное @Transient
), либо вы можете использовать геттер и предоставлять информацию оттуда. Каждый раз, когда вам нужно получить доступ к name_length
, вы будете вызывать этот геттер, но вы не будете хранить информацию в базе данных.
Даже если вы хотите рассчитать длину за пределами вашего приложения, вы все равно можете использовать для этого некоторую функцию базы данных - как длина.
Изменить в соответствии с требованием, указанным OP:
В JPA есть два способа объявления столбцов - либо в полях, либо в методах (геттерах / сеттерах). Это будет примерно так:
@Column(name = "complex_calculation") // Due to some bad requirement
public Integer getNameLength() {
return fisrtName.length() + lastName.length();
}
Однако вы упомянули Ebean в своем вопросе, и Ebean не рассматривается как эталонная реализация JPA. Есть большая вероятность, что это еще не поддерживается, но вы можете попробовать это в своем конкретном случае.
Есть еще один способ, который доказал свою эффективность. Вы определяете свою модель следующим образом:
@Entity
public class Person extends Model {
@Id
private Long id;
private String firstName;
private String lastName;
private Integer nameLength;
public Long getId() {
return id;
}
// getter for first name and last name with @Column annotation
@Column(name = "complex_calculation")
public Integer getNameLength() {
return firstName.length() + lastName.length();
}
public Person (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
updateComplexCalculation();
}
public void setFirstName(String firstName) {
this.firstName = firstName;
updateComplexCalculation();
}
public void setLastName(String lastName) {
this.lastName = lastName;
updateComplexCalculation();
}
private void updateComplexCalculation() {
this.nameLength = firstName.length() + lastName.length();
}
}
Важная часть - это метод updateComplexCalculation
. При вызове конструктора и при каждом вызове установщика вы вызываете этот метод для обновления свойства сложного. Конечно, вы должны вызывать его только для вызовов установщика, которые необходимы для вычислений.
Следующий код:
Person p = new Person("foo", "bar");
p.save();
Logger.debug("Complex calculation: " + p.getNameLength());
p.setFirstName("somethingElse");
p.save();
Logger.debug("Complex calculation: " + p.getNameLength());
дает тогда:
[debug] application - Complex calculation: 6
[debug] application - Complex calculation: 16
person
Anton
schedule
24.03.2016