Как используется @Implementation?
Недавно я обнаружил ActiveObejcts, и мне действительно это нравится. Сейчас я использую последнюю версию плагина Atlassian, только net.java.ao
часть для ORM. Компилируется и работает нормально. Конечно, я должен сделать несколько тестов производительности, если это соответствует моим требованиям.
Существует аннотация @Implementation. Как это используется? Javadocs очень короткие.
Обновить
Решение:
public class M5 {
public static void main(String[] args) throws SQLException {
EntityManager m = EntityManagerBuilder
.url("jdbc:hsqldb:./db/db")
.username("root")
.password("")
.c3po()
.build();
m.migrate(Employee.class);
Employee p = m.create(Employee.class);
p.setFirstName("Peter");
p.setLastName("Mmm");
System.err.println(p.getLastName()); // prints "ln: Mmm"
p.save();
}
}
public class Emp {
private Employee employee;
public Emp(Employee employee) {
this.employee = employee;
}
public String getLastName() {
return "ln: " + employee.getLastName();
}
}
@Implementation(Emp.class)
interface Employee extends Entity {
String getFirstName();
void setFirstName(String name);
String getLastName();
void setLastName(String name);
}
}
1 ответ
Active Objects берет ваш интерфейс и через отражение через сложный прокси переводит ваши геттеры, сеттеры и отношения в операторы SQL. Если вы хотите, чтобы часть вашего собственного кода добавляла или изменяла функциональность вашего интерфейса AO, вы можете использовать @Implementation
Пример:
AO интерфейс:
@Implementation(PersonImpl.class)
public interface Person extends Entity {
String getLastName();
void setLastName(String name);
String getFirstName();
void setFirstName(String name);
@Ignore
String getName();
}
Реализация:
public class PersonImpl {
private final Person person; // this will be the original entity proxy
public PersonImpl(Person person) {
this.person = person;
}
// "Implement" ignored functions
public String getName() {
return String.format("%s %s", this.person.getFirstName(), this.person.getLastName());
}
// "Enhance" AO getters/setters
public void setFirstName(String name) {
this.person.setFirstName("Foobar");
}
}
Обратите внимание, что АО обращается к этим методам реализации через отражение. Они должны соответствовать именам в интерфейсе. Это может привести к проблемам во время рефакторинга, поскольку имена методов могут измениться, и ваш компилятор не скажет вам, что у вашего соответствующего имени метода impl нет.