Я пишу гибкий RIA, который связывается с Java-сервером.У меня есть следующие классы в Java, которые используют аннотации hibernate.
@Entity
@Table(name="Adjustment")
public class Adjustment implements Serializable {
@OneToOne(fetch = FetchType.EAGER)
private AdjustmentDetails _adjustmentDetails;
....
has other fields, not important to context of question
}
@Entity
@Table(name = "AdjustmentDetails")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AdjustmentDetails {
@Id
@Column(name = "sale_order_number", nullable = false)
protected Integer _saleOrderNumber;
public abstract Integer getSaleOrderNumber();
public abstract void setSaleOrderNumber(Integer saleOrderNumber);
}
@Entity
@Table(name="Cancellations")
public class Cancellation extends AdjustmentDetails implements Serializable {
fields...
}
@Entity
@Table(name="GiftCardAdjustment")
public class GiftCardAdjustment extends AdjustmentDetails {
fields...
}
Это настраивает базу данных именно так, как мне нужно.Теперь я пытаюсь передать корректировку для flex со следующими структурами классов в actionscript.
[Bindable]
[RemoteClass(alias="Adjustment")]
public class Adjustment{
private var _adjustmentDetails:AdjustmentDetails;
}
А теперь проблема ... У меня проблема, потому что flex не поддерживает абстрактные классы или болееКстати, у объекта Java должен быть конструктор без параметров, который будет передан в flex.Я пробовал это ...
[Bindable]
[RemoteClass(alias="AdjustmentDetails")]
public class AdjustmentDetails{
public function AdjustmentDetails(){}
}
с
[Bindable]
[RemoteClass(alias="Cancellations")]
public class Cancellation extends AdjustmentDetails {
private var _saleOrderNumber:int;
public function set saleOrderNumber(saleOrderNumber:int):void{
_saleOrderNumber = saleOrderNumber;
}
public function get saleOrderNumber():int { return _saleOrderNumber;}
}
, и я пробовал это ...
[Bindable]
[RemoteClass(alias="AdjustmentDetails")]
public class AdjustmentDetails{
protected _saleOrderNumber:int;
public function AdjustmentDetails(saleOrderNumber:int = 0){
_saleOrderNumber = saleOrderNumber;
}
public function get saleOrderNumber():int{
return _saleOrderNumber;
}
public function set saleOrderNumber(saleOrderNumber:int):void{
_saleOrderNumber = saleOrderNumber;
}
}
с
[Bindable]
[RemoteClass(alias="Cancellations")]
public class Cancellation extends AdjustmentDetails {
public function Cancellation(saleOrderNumber:int){
super(saleOrderNumber);
}
}
И я попытался
[Bindable]
[RemoteClass(alias="AdjustmentDetails"]
public interface AdjustmentDetails {
function get saleOrderNumber():int;
function set saleOrderNumber(saleOrderNumber:int);
}
с
[Bindable]
[RemoteClass(alias="Cancellation")]
public class Cancellation implements AdjustmentDetails{
saleOrderNumber functions....
}
, но я получаю следующую ошибку, независимо от того, каким образом реализован ActionScript, при попытке передать корректировку для flex
TypeError: Error #1034: Type Coercion failed: cannot convert Object@1a33c509 to
com.wctny.db.model.AdjustmentDetails.
Проходят другие поля настройки, некоторые из которых являются классами ... просто не детали ...
любые идеи о том, как это исправить, чтобы детали могли бытьодин из множества различных типов, извлеченных из базы данных?
есть ли способ заставить flex использовать абстрактный класс Java, как он реализован ...?